/**
 * @author: hdh
 * @date: 2022-06-29 9:32
 */
package com.yy.QSManage.service.base;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yy.QSManage.model.entity.FaSysGrid;

import java.util.Collection;
import java.util.List;

/**
 * 获取数据
 * @author: HuDeHong
 * @date: 2022-06-29 9:32
 */
public interface DataService<T> {

    /**
     * 根据参数获取单条数据
     * @param field
     * @param param
     * @return
     */
    T getByParam(SFunction<T, Object> field, Object param);

    /**
     * 根据参数获取单条数据
     * @param field
     * @param param
     * @return
     */
    T getByParam(String field, Object param);

    /**
     * 根据参数获取单条数据
     * @param field
     * @param param
     * @param throwEx
     * @return
     */
    T getByParam(SFunction<T, Object> field, Object param, boolean throwEx);

    /**
     * 根据参数获取多条数据
     * @param field
     * @param param
     * @return: java.util.List<T>
     * @author: HuDeHong
     * @date: 2022-07-26 17:04
     */
    List<T> listByParam(SFunction<T, Object> field, Object param);

    /**
     * 根据参数获取多条数据
     * 默认排序 sort desc
     * @param field
     * @param param
     * @return
     */
    List<T> listByParam(String field, Object param);

    /**
     * 根据参数获取多条数据
     * 排序 sort asc
     * @param field
     * @param param
     * @return
     */
    List<T> listByParamAsc(String field, Object param);

    /**
     * 根据参数获取多条数据
     * 排序 sortField desc
     * @param field
     * @param param
     * @param orderField
     * @return
     */
    List<T> listByParamDesc(String field, Object param, String orderField);

    /**
     * 根据参数获取多条数据
     * 排序 sortField asc
     * @param field
     * @param param
     * @param orderField
     * @return
     */
    List<T> listByParamAsc(String field, Object param, String orderField);

    /**
     * 根据参数获取多条数据
     * 排序 orderField order
     * @param field
     * @param param
     * @param orderField
     * @return
     */
    List<T> listByParamOrder(String field, Object param, String orderField, String order);

    /**
     * 根据参数获取多条数据(包含)
     * @param field
     * @param param
     * @return: java.util.List<T>
     * @author: HuDeHong
     * @date: 2023-03-21 11:42
     */
    List<T> listInParam(SFunction<T, Object> field, Object... param);

    /**
     * 根据参数获取多条数据(包含)
     * @param field
     * @param param
     * @return: java.util.List<T>
     * @author: HuDeHong
     * @date: 2023-04-11 13:49
     */
    List<T> listInParam(SFunction<T, Object> field, Collection<?> param);

    /**
     * 根据参数获取多条数据(不包含)
     * @param field
     * @param param
     * @return: java.util.List<T>
     * @author: HuDeHong
     * @date: 2023-03-21 11:42
     */
    List<T> listNotInParam(SFunction<T, Object> field, Object... param);

    /**
     * 据参数获取多条数据(不包含)
     * 默认排序desc
     * @param field
     * @param orderDesc
     * @param param
     * @return
     */
    List<T> listNotInParam(SFunction<T, Object> field, SFunction<T, Object> orderDesc, Object... param);

    /**
     * 根据参数获取多条数据(模糊匹配)
     * @param field
     * @param param
     * @return: java.util.List<T>
     * @author: HuDeHong
     * @date: 2023-03-21 11:31
     */
    List<T> listLikeParam(SFunction<T, Object> field, Object param);

    /**
     * 获取排序后第一条数据（倒叙）
     * @param sortParam
     * @return: T
     * @author: HuDeHong
     * @date: 2023-03-21 14:59
     */
    T getOneDesc(SFunction<T, Object> sortParam);

    /**
     * 获取排序后第一条数据（正叙）
     * @param sortParam
     * @return: T
     * @author: HuDeHong
     * @date: 2023-03-21 14:59
     */
    T getOneAsc(SFunction<T, Object> sortParam);

    /**
     * 获取排序后第一条数据（倒叙）
     * @param field
     * @param param
     * @param sortParam
     * @return: T
     * @author: HuDeHong
     * @date: 2023-03-21 14:59
     */
    T getOneDesc(SFunction<T, Object> field, Object param, SFunction<T, Object> sortParam);

    /**
     * 获取排序后第一条数据（正叙）
     * @param field
     * @param param
     * @param sortParam
     * @return: T
     * @author: HuDeHong
     * @date: 2023-03-21 14:59
     */
    T getOneAsc(SFunction<T, Object> field, Object param, SFunction<T, Object> sortParam);

    /**
     * 查询逻辑删除数据
     * @param field
     * @param param
     * @return: T
     * @author: HuDeHong
     * @date: 2022-12-10 16:03
     */
    T getDelByParam(SFunction<T, Object> field, Object param);

    /**
     * 逻辑删除
     * @param field
     * @param param
     * @return: void
     * @author: HuDeHong
     * @date: 2022-12-25 1:28
     */
    void removeByParam(SFunction<T, Object> field, Object param);

    /**
     * 随机抽取一条数据
     * @param
     * @return: T
     * @author: HuDeHong
     * @date: 2023-01-11 16:54
     */
    T randomExtraction();

    /**
     * 随机抽取一条数据(带一个条件)
     * @param
     * @return: T
     * @author: HuDeHong
     * @date: 2023-01-11 16:54
     */
    T randomExtraction(SFunction<T, Object> field, Object param);

    /**
     * 默认分页
     * @param page
     * @param t 查询参数
     * @param grid 网格配置
     * @return
     */
    IPage<T> page(Page page, T t, FaSysGrid grid);

    /**
     * 默认分页
     * 无需写sql
     * @param page
     * @return
     */
    IPage<T> pageNoSql(Page page);

    /**
     * 编辑字段
     * @param field
     * @param param
     * @param id
     */
    void updateById(SFunction<T, Object> field, Object param, String id);

    /**
     * 批量编辑字段
     * @param field
     * @param param
     * @param ids
     */
    void updateBatchByIds(SFunction<T, Object> field, Object param, Collection<String> ids);

    /**
     * 大于该字段的第一条数据
     * 以该字段正序排序
     * @param field
     * @param param
     * @return
     */
    T getGtOne(String field, Object param);

    /**
     * 小于该字段的第一条数据
     * 以该字段正序排序
     * @param field
     * @param param
     * @return
     */
    T getLtOne(String field, Object param);

    /**
     * 获取该字段最大值数据
     * @param field
     * @return
     */
    T getMax(String field);

    /**
     * 获取该字段最小值数据
     * @param field
     * @return
     */
    T getMin(String field);

    /**
     * 获取指定位数的随机code(数字+大写字母)
     * 并判断该字段是否存在，只返回不存在的code
     * @param field
     * @param num
     * @return
     */
    String getCode(SFunction<T, Object> field,int num);

    /**
     * 获取指定位数的随机code(数字+大写字母)
     * 并判断该字段是否存在，只返回不存在的code并判断是否与临时列表重复
     * @param field
     * @param num
     * @param tempList 临时列表
     * @return
     */
    String getCodes(SFunction<T, Object> field,int num, List<String> tempList);
}
